﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using GrupyzServices.Logging;
using GrupyzServices.Reports;
using System.Web;

namespace GrupyzServices.BdAccess
{
    public class VoucherRepository:IVoucherRepository
    {
        GrupyzEntities _entity;
        ILogger log;

        public VoucherRepository()
        {
            _entity = new GrupyzEntities();
            log = new NLogLogger();
        }

        public VoucherViewModel GetVoucherDetailsByOrder(int orderId)
        {
            throw new NotImplementedException();
        }

        public VoucherViewModel GetVoucherDetails(int VoucherId)
        {
            throw new NotImplementedException();
        }


        public string CreateVoucherByOrder(int orderId)
        {
            try
            {
                PdfCreator pdf = new PdfCreator();
                Voucher v = new Voucher();
                v.CodSeguranca = GenerateSecurityCode(15);
                v.OrderId = orderId;
                v.Referencia = GenerateSecurityCode(9);
                v.DataCriacao = DateTime.Now;
                DealRepository dr = new DealRepository();
                Deal deal = dr.GetDealByOrder(orderId);
                v.Validade = deal.Expira;
                
                VoucherViewModel vm = new VoucherViewModel();
                vm.CodSeguranca = v.CodSeguranca;
                vm.Referencia = v.Referencia;
                vm.Condicoes = dr.GetCondicoes(deal.Id);
                vm.Destaque = dr.GetDestaques(deal.Id);
                vm.Descricao = deal.Descricao;
                vm.DataCriacao = v.DataCriacao;
                vm.Validade = v.Validade;

                ParceiroRepository pr = new ParceiroRepository();
                Parceiro par = pr.GetParceiroById(deal.ParceiroId);
                
                vm.Email = par.Email;
                vm.Imagem = deal.Artigo.Imagem;
                vm.Morada = par.Morada;
                vm.CodPostal_Localidade = par.CodPostal + " " + par.Localidade;
                vm.NomeParceiro = par.NomeNegocio;
                vm.Telefone = par.Telefone;
                vm.Valor = deal.PrecoVenda.ToString();
                
                string tmpfile = pdf.CreateVoucher(vm);

                v.Filename = ReverseMapPath(tmpfile);

                _entity.Vouchers.AddObject(v);
                _entity.SaveChanges();
                
                return tmpfile;
            }
            catch (Exception ex)
            {
                log.Error(ex.Message);
                return null;
            }
            
        }

        private string ReverseMapPath(string PhysicalFilePath)
        {
            string AppPath = HttpContext.Current.Server.MapPath("~");
            string url = string.Format("~{0}", PhysicalFilePath.Replace(AppPath, "").Replace("\\", "/"));
            return url;
        }

        private string GenerateSecurityCode(int number)
        {
            Random rGen = new Random();
            string[] strCharacters = { "A","B","C","D","E","F","G",
            "H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y",
            "Z","1","2","3","4","5","6","7","8","9","0","a","b","c","d","e","f","g","h",
            "i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};

            int p = 0;
            string strPass = "";
            for (int x = 0; x <= number; x++)
            {
                p = rGen.Next(0, 60);
                strPass += strCharacters[p];
            }
            return strPass;
        }
    }
}
